/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import Controladores.exceptions.IllegalOrphanException;
import Controladores.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Entidades.Controlaulas;
import java.util.ArrayList;
import java.util.Collection;
import Entidades.Controlcatedraticos;
import Entidades.Estado;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author Miguel
 */
public class EstadoJpaController implements Serializable {

    public EstadoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Estado estado) {
        if (estado.getControlaulasCollection() == null) {
            estado.setControlaulasCollection(new ArrayList<Controlaulas>());
        }
        if (estado.getControlcatedraticosCollection() == null) {
            estado.setControlcatedraticosCollection(new ArrayList<Controlcatedraticos>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Collection<Controlaulas> attachedControlaulasCollection = new ArrayList<Controlaulas>();
            for (Controlaulas controlaulasCollectionControlaulasToAttach : estado.getControlaulasCollection()) {
                controlaulasCollectionControlaulasToAttach = em.getReference(controlaulasCollectionControlaulasToAttach.getClass(), controlaulasCollectionControlaulasToAttach.getIdControlAulas());
                attachedControlaulasCollection.add(controlaulasCollectionControlaulasToAttach);
            }
            estado.setControlaulasCollection(attachedControlaulasCollection);
            Collection<Controlcatedraticos> attachedControlcatedraticosCollection = new ArrayList<Controlcatedraticos>();
            for (Controlcatedraticos controlcatedraticosCollectionControlcatedraticosToAttach : estado.getControlcatedraticosCollection()) {
                controlcatedraticosCollectionControlcatedraticosToAttach = em.getReference(controlcatedraticosCollectionControlcatedraticosToAttach.getClass(), controlcatedraticosCollectionControlcatedraticosToAttach.getIdControlCatedraticos());
                attachedControlcatedraticosCollection.add(controlcatedraticosCollectionControlcatedraticosToAttach);
            }
            estado.setControlcatedraticosCollection(attachedControlcatedraticosCollection);
            em.persist(estado);
            for (Controlaulas controlaulasCollectionControlaulas : estado.getControlaulasCollection()) {
                Estado oldEstadoidEstadoOfControlaulasCollectionControlaulas = controlaulasCollectionControlaulas.getEstadoidEstado();
                controlaulasCollectionControlaulas.setEstadoidEstado(estado);
                controlaulasCollectionControlaulas = em.merge(controlaulasCollectionControlaulas);
                if (oldEstadoidEstadoOfControlaulasCollectionControlaulas != null) {
                    oldEstadoidEstadoOfControlaulasCollectionControlaulas.getControlaulasCollection().remove(controlaulasCollectionControlaulas);
                    oldEstadoidEstadoOfControlaulasCollectionControlaulas = em.merge(oldEstadoidEstadoOfControlaulasCollectionControlaulas);
                }
            }
            for (Controlcatedraticos controlcatedraticosCollectionControlcatedraticos : estado.getControlcatedraticosCollection()) {
                Estado oldEstadoidEstadoOfControlcatedraticosCollectionControlcatedraticos = controlcatedraticosCollectionControlcatedraticos.getEstadoidEstado();
                controlcatedraticosCollectionControlcatedraticos.setEstadoidEstado(estado);
                controlcatedraticosCollectionControlcatedraticos = em.merge(controlcatedraticosCollectionControlcatedraticos);
                if (oldEstadoidEstadoOfControlcatedraticosCollectionControlcatedraticos != null) {
                    oldEstadoidEstadoOfControlcatedraticosCollectionControlcatedraticos.getControlcatedraticosCollection().remove(controlcatedraticosCollectionControlcatedraticos);
                    oldEstadoidEstadoOfControlcatedraticosCollectionControlcatedraticos = em.merge(oldEstadoidEstadoOfControlcatedraticosCollectionControlcatedraticos);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Estado estado) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Estado persistentEstado = em.find(Estado.class, estado.getIdEstado());
            Collection<Controlaulas> controlaulasCollectionOld = persistentEstado.getControlaulasCollection();
            Collection<Controlaulas> controlaulasCollectionNew = estado.getControlaulasCollection();
            Collection<Controlcatedraticos> controlcatedraticosCollectionOld = persistentEstado.getControlcatedraticosCollection();
            Collection<Controlcatedraticos> controlcatedraticosCollectionNew = estado.getControlcatedraticosCollection();
            List<String> illegalOrphanMessages = null;
            for (Controlaulas controlaulasCollectionOldControlaulas : controlaulasCollectionOld) {
                if (!controlaulasCollectionNew.contains(controlaulasCollectionOldControlaulas)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Controlaulas " + controlaulasCollectionOldControlaulas + " since its estadoidEstado field is not nullable.");
                }
            }
            for (Controlcatedraticos controlcatedraticosCollectionOldControlcatedraticos : controlcatedraticosCollectionOld) {
                if (!controlcatedraticosCollectionNew.contains(controlcatedraticosCollectionOldControlcatedraticos)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Controlcatedraticos " + controlcatedraticosCollectionOldControlcatedraticos + " since its estadoidEstado field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Collection<Controlaulas> attachedControlaulasCollectionNew = new ArrayList<Controlaulas>();
            for (Controlaulas controlaulasCollectionNewControlaulasToAttach : controlaulasCollectionNew) {
                controlaulasCollectionNewControlaulasToAttach = em.getReference(controlaulasCollectionNewControlaulasToAttach.getClass(), controlaulasCollectionNewControlaulasToAttach.getIdControlAulas());
                attachedControlaulasCollectionNew.add(controlaulasCollectionNewControlaulasToAttach);
            }
            controlaulasCollectionNew = attachedControlaulasCollectionNew;
            estado.setControlaulasCollection(controlaulasCollectionNew);
            Collection<Controlcatedraticos> attachedControlcatedraticosCollectionNew = new ArrayList<Controlcatedraticos>();
            for (Controlcatedraticos controlcatedraticosCollectionNewControlcatedraticosToAttach : controlcatedraticosCollectionNew) {
                controlcatedraticosCollectionNewControlcatedraticosToAttach = em.getReference(controlcatedraticosCollectionNewControlcatedraticosToAttach.getClass(), controlcatedraticosCollectionNewControlcatedraticosToAttach.getIdControlCatedraticos());
                attachedControlcatedraticosCollectionNew.add(controlcatedraticosCollectionNewControlcatedraticosToAttach);
            }
            controlcatedraticosCollectionNew = attachedControlcatedraticosCollectionNew;
            estado.setControlcatedraticosCollection(controlcatedraticosCollectionNew);
            estado = em.merge(estado);
            for (Controlaulas controlaulasCollectionNewControlaulas : controlaulasCollectionNew) {
                if (!controlaulasCollectionOld.contains(controlaulasCollectionNewControlaulas)) {
                    Estado oldEstadoidEstadoOfControlaulasCollectionNewControlaulas = controlaulasCollectionNewControlaulas.getEstadoidEstado();
                    controlaulasCollectionNewControlaulas.setEstadoidEstado(estado);
                    controlaulasCollectionNewControlaulas = em.merge(controlaulasCollectionNewControlaulas);
                    if (oldEstadoidEstadoOfControlaulasCollectionNewControlaulas != null && !oldEstadoidEstadoOfControlaulasCollectionNewControlaulas.equals(estado)) {
                        oldEstadoidEstadoOfControlaulasCollectionNewControlaulas.getControlaulasCollection().remove(controlaulasCollectionNewControlaulas);
                        oldEstadoidEstadoOfControlaulasCollectionNewControlaulas = em.merge(oldEstadoidEstadoOfControlaulasCollectionNewControlaulas);
                    }
                }
            }
            for (Controlcatedraticos controlcatedraticosCollectionNewControlcatedraticos : controlcatedraticosCollectionNew) {
                if (!controlcatedraticosCollectionOld.contains(controlcatedraticosCollectionNewControlcatedraticos)) {
                    Estado oldEstadoidEstadoOfControlcatedraticosCollectionNewControlcatedraticos = controlcatedraticosCollectionNewControlcatedraticos.getEstadoidEstado();
                    controlcatedraticosCollectionNewControlcatedraticos.setEstadoidEstado(estado);
                    controlcatedraticosCollectionNewControlcatedraticos = em.merge(controlcatedraticosCollectionNewControlcatedraticos);
                    if (oldEstadoidEstadoOfControlcatedraticosCollectionNewControlcatedraticos != null && !oldEstadoidEstadoOfControlcatedraticosCollectionNewControlcatedraticos.equals(estado)) {
                        oldEstadoidEstadoOfControlcatedraticosCollectionNewControlcatedraticos.getControlcatedraticosCollection().remove(controlcatedraticosCollectionNewControlcatedraticos);
                        oldEstadoidEstadoOfControlcatedraticosCollectionNewControlcatedraticos = em.merge(oldEstadoidEstadoOfControlcatedraticosCollectionNewControlcatedraticos);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = estado.getIdEstado();
                if (findEstado(id) == null) {
                    throw new NonexistentEntityException("The estado with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Estado estado;
            try {
                estado = em.getReference(Estado.class, id);
                estado.getIdEstado();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The estado with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Controlaulas> controlaulasCollectionOrphanCheck = estado.getControlaulasCollection();
            for (Controlaulas controlaulasCollectionOrphanCheckControlaulas : controlaulasCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Estado (" + estado + ") cannot be destroyed since the Controlaulas " + controlaulasCollectionOrphanCheckControlaulas + " in its controlaulasCollection field has a non-nullable estadoidEstado field.");
            }
            Collection<Controlcatedraticos> controlcatedraticosCollectionOrphanCheck = estado.getControlcatedraticosCollection();
            for (Controlcatedraticos controlcatedraticosCollectionOrphanCheckControlcatedraticos : controlcatedraticosCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Estado (" + estado + ") cannot be destroyed since the Controlcatedraticos " + controlcatedraticosCollectionOrphanCheckControlcatedraticos + " in its controlcatedraticosCollection field has a non-nullable estadoidEstado field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            em.remove(estado);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Estado> findEstadoEntities() {
        return findEstadoEntities(true, -1, -1);
    }

    public List<Estado> findEstadoEntities(int maxResults, int firstResult) {
        return findEstadoEntities(false, maxResults, firstResult);
    }

    private List<Estado> findEstadoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Estado.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Estado findEstado(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Estado.class, id);
        } finally {
            em.close();
        }
    }

    public int getEstadoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Estado> rt = cq.from(Estado.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
